home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
WINDOWS
/
PROFFT.ARJ
/
GENPWIN.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-28
|
14KB
|
400 lines
/****************************************************************************
GENPWIN.CPP Denne filen inneholder (i denne rekkef°lgen):
*****************************************************************************
TGenericPicWindow::TGenericPicWindow(PTWindowsObject AParent, LPSTR FName,
BITMAPINFO *bmpInfo, HANDLE hBitmap, BOOL bBitmap)
TGenericPicWindow::~TGenericPicWindow()
void TGenericPicWindow::Paint(HDC, PAINTSTRUCT& PaintInfo)
void TGenericPicWindow::AdjustScroller()
void TGenericPicWindow::WMSize(TMessage& Msg)
void TGenericPicWindow::EditCopy()
BOOL TGenericPicWindow::LockBMP()
void TGenericPicWindow::UnlockBMP()
BITMAPINFO* TGenericPicWindow::MakeDuplicateBMPInfo(LPBITMAPINFO source)
void TGenericPicWindow::CopyBMP(HANDLE hSourceBitmap, HANDLE hTargetBitmap)
****************************************************************************/
#include <owl.h>
#include <filedial.h>
#include <dir.h>
#include <string.h>
#pragma hdrstop
#include "profftid.h" // Symbolske konstanter
#include "profft.h" // Klassedefinisjoner
TGenericPicWindow::TGenericPicWindow(PTWindowsObject AParent, LPSTR FName,
BITMAPINFO *bmpInfo, HANDLE hBitmap, BOOL bBitmap)
: TWindow(AParent, "")
/****************************************************************************
Setter opp et standard vindu til bruk i vσr applikasjon. Denne
konstruktoren passer pσ at vinduet fσr riktig stil, dvs. at det er
flyttbart, har scrollbars o.l. I tillegg passer den pσ at vinduet fσr
en beskrivende overskrift.
PTWindowsObject AParent Peker til foreldrevinduet (TMainWindow i vσr
applikasjon).
LPSTR Caption Peker til en streng som skal komme fram i vindusoverskriften.
BITMAPINFO *bmpInfo Peker til et BITMAPINFO struktur. MERK! Denne
strukturen mσ vµre allokert f°r pekeren sendes
videre til konstruktoren (dvs. konstruktoren tar
seg ikke av minneallokeringen).
HANDLE hBitmap Windows handle til et omrσde i minnet som inneholder
rσdataene i et bitmap bilde (merk _ikke_ et Windows
bitmapobjekt!). Denne forutsettes σ vµre allokert pσ
forhσnd.
BOOL bBitmap Forteller om subklassen er et bitmap eller komplekst
bilde.
Returnerer: NULL hvis det av en eller annen grunn ikke gikk an σ
lage instansiere objektet (f.eks. for lite minne).
Krever: At det pσ forhσnd er allokert minne til BITMAPINFO strukturen
og en handle til bitmap bildet.
Informasjon:
Vitsen med σ kreve forhσndsallokering er at vi ikke vet om dataene er
gyldig f°r vi har sjekket de (etter vi har allokert de). Ved σ gj°re det
pσ denne mσten, allokerer vi ikke et "ugyldig" objekt, dvs. et objekt
som inneholder "svada" data. Hvis det viser seg at dataene vi leser
inn er ugyldige, s°rger bare den funksjonen som skulle til σ instansiere
ett nytt TGenericPicWindow objekt (dvs. eg. en subklasse av denne) σ
deallokere minne og la vµre σ instansiere objektet.
Kodet av: MK 12.03.92
*****************************************************************************/
{
char TitleStr[MAX_CAPTION_LENGTH];
char TempStr[MAX_CAPTION_LENGTH];
char acTemp[20];
RECT rect;
int iScreenY, iW, i;
// Setter riktig vindusstil med scrollbars.
Attr.Style |= WS_VSCROLL | WS_HSCROLL;
Scroller = new TScroller(this, 1, 1, 200, 200); // Lager scrollbars
// Setter riktig overskrift pσ vinduet. Hvis bildet er et bitmap bilde
// (fra disk eller clipboard) vises hele filadressen. Hvis ikke vises
// kun navnet som bildet stammer fra (siste delen av hele filnavnet)
// Hvis bildet stammer fra clipboard (FName[0]="<") vises dette spesiellt.
if (bBitmap)
{
strcpy(TitleStr, "Bmp: ");
lstrcat(TitleStr, FName); // Kopierer caption i temporµre TitleStr
}
else
{
strcpy(TitleStr, "Complex: ");
if (FName[0]!='<')
{
fnsplit((char const *)FName, NULL, NULL, TempStr, NULL);
lstrcat(TitleStr, TempStr);
// Fjerner filspesifikasjonen pσ bilder som stammer fra dette
lstrcpy(FName, TempStr);
}
else
lstrcat(TitleStr, FName);
}
// Henter bildest°rrelsen og legger denne til i overskriften.
wsprintf(acTemp, " (%ldx%ld)", bmpInfo->bmiHeader.biWidth, bmpInfo->bmiHeader.biHeight);
lstrcat(TitleStr, acTemp);
Title = _fstrdup(TitleStr); // og allokerer denne dynamisk.
TGenericPicWindow::bmpInfo = bmpInfo; // Peker til BITMAPINFO struktur
TGenericPicWindow::hBitmap = hBitmap; // Handle til bitmap dataene
// Tar var pσ hele filnavnet til senere bruk.
lstrcpy(FileName, FName);
// Denne fors°ker σ sette vindusst°rrelsen slik at bildet passer
// n°yaktig inn. Hvis bildet er for lite, settes vindusst°rrelsen
// sσ liten som mulig. Hvis bildet er for stort brukes default
// st°rrelse og scrollbars. Merk! Den benytter hovedvinduets
// st°rrelse nσr den regner ut posisjoneringen, siden alle
// barnevinduer skal befinne seg i hovedvinduet.
GetClientRect(AParent->HWindow, &rect);
if (bmpInfo->bmiHeader.biWidth<=(rect.right-rect.left))
Attr.W=(int)bmpInfo->bmiHeader.biWidth+2*GetSystemMetrics(SM_CXFRAME);
if (bmpInfo->bmiHeader.biHeight<=(rect.bottom-rect.top))
Attr.H=(int)bmpInfo->bmiHeader.biHeight
+GetSystemMetrics(SM_CYCAPTION)+2*GetSystemMetrics(SM_CYFRAME)-1;
}
TGenericPicWindow::~TGenericPicWindow()
/****************************************************************************
Rydder opp f°r TGenericPicWindow objektet fjerner seg selv. Det vil si
at denne destruktoren deallokerer minnet til BITMAPINFO strukturen og
frigj°r handelen til bitmap bildet.
Kodet av: MK 12.03.92
*****************************************************************************/
{
if (hBitmap)
GlobalFree(hBitmap); // Frigj°r bitmapbilde dataene.
if (bmpInfo!=NULL)
delete bmpInfo; // Frigj°r infostrukturen til bitmapbildet.
}
#pragma -w-sus
void TGenericPicWindow::Paint(HDC, PAINTSTRUCT& PaintInfo)
/****************************************************************************
Viser bitmapbildet i vinduet nσr dette objektet fσr beskjed om σ vise
seg (dvs. mottar en WM_PAINT beskjed).
PAINTSTRUCT& PaintInfo PAINTSTRUCT som inneholder omrσdet som mσ
tegnes om.
Kodet av:
13.03.92/MK: Laget funksjonen for f°rste gang.
19.03.92/MK: Forandret funksjonen slik at den ikke lager et bitmap
objekt, men beholder bildeinformasjonen. Var n°dvendig fordi
vi er avhengige av σ hente fram alle grσtonene for σ
transformere.
10.04.92/MK: La inn st°tte for σ vise filtrene hvis brukeren holder
pσ med filtrering (r°de ringer).
*****************************************************************************/
{
HDC MemoryDC;
HANDLE OldBitmapHandle;
RECT rectClient;
char huge *hpPixels;
if (hBitmap) // Hvis det faktisk finnes noe bilde
{
if (IsIconic(HWindow))
{
; // Display icon
}
else
{
// Velger hovedvinduets palette (som faktisk inneholder
// de grσtonene som er aktuelle.
SelectPalette(PaintInfo.hdc, ((TMainWindow *)Parent)->hPal, 0);
SetMapMode(PaintInfo.hdc, MM_TEXT);
if (LockBMP()) // Hvis vi fσr en peker til bildet (fσes i LockBMP())
{
// "Maler" DeviceIndependet bitmappen vσr pσ klientomrσdet
// i vinduet.
SetDIBitsToDevice(PaintInfo.hdc, 0, 0,
bmpInfo->bmiHeader.biWidth, bmpInfo->bmiHeader.biHeight,
0, 0, 0, bmpInfo->bmiHeader.biHeight,
&hpBitmap[0], bmpInfo, DIB_RGB_COLORS);
UnlockBMP();
}
else
MessageBox(HWindow, "TGenericPicWindow::Paint hpPixel==NULL", ERROR_CAPTION, MB_ERROR);
}
}
}
#pragma -wsus
void TGenericPicWindow::AdjustScroller()
/****************************************************************************
Justerer scrollbars i.h.t. vinduet. Brukes ved lasting av nye bilder og
ved justering av billedst°rrelsen.
Sist forandret:
13.03.92/MK: Laget funksjonen for f°rste gang.
*****************************************************************************/
{
// Setter riktig omrσde pσ scrollbarene og viser °verste venstre
// del av bildet.
Scroller->SetRange(bmpInfo->bmiHeader.biWidth - Attr.W,
bmpInfo->bmiHeader.biHeight - Attr.H);
Scroller->ScrollTo(0,0);
InvalidateRect(HWindow, NULL, TRUE); // Be vinduet oppdatere seg
}
void TGenericPicWindow::WMSize(TMessage& Msg)
/****************************************************************************
Mottar WM_SIZE beskjeder fra Windows og sender disse videre til
superklassen. Passer ogsσ pσ σ kalle AdjustScroller() hvis vindus-
st°rrelsen forandres.
TMessage& Msg Sendes videre til superklassens tilsvarene funksjon.
Sist forandret:
13.03.92/MK: Laget funksjonen for f°rste gang.
*****************************************************************************/
{
TWindow::WMSize(Msg);
if ((Msg.WParam!=SIZEICONIC))
AdjustScroller();
}
void TGenericPicWindow::EditCopy()
/****************************************************************************
Kopierer bitmapbildet til det aktive barnevinduet til clipboard.
Kalles ved menyvalg Copy eller Cut.
Kodet av: MK 24.04.92
Modifisert: MK 26.04.92 Fikset bugs i forbindelse med store (>64K)
bitmaps. Skyldtes feil i C sine biblioteks-
rutiner som feiler hvis en funksjon adresserer
forbi et segmentskifte (64K).
*****************************************************************************/
{
WORD wSize;
int iY, iW, iH, iNum;
HDC hdc;
HPALETTE hCbdPalette;
HANDLE hMem;
char huge *hpMem;
long lSize, Count;
HCURSOR hcrOld;
iW = (int)bmpInfo->bmiHeader.biWidth; // Lagrer disse for σ minske
iH = (int)bmpInfo->bmiHeader.biHeight; // aksess og skriverarbeid.
if (LockBMP()) // Hvis vi fσr en peker til bildet..
{
// Vis timeglasset (byte til bytekopiering tar litt tid)
hcrOld = SetCursor(((TMainWindow *)Parent)->hcrWait);
// St°rrelsen pσ bildestrukturdataene
wSize = sizeof(BITMAPINFOHEADER) + ((1 << bmpInfo->bmiHeader.biBitCount) * sizeof(RGBQUAD));
// Bildest°rrelsen
lSize = (((bmpInfo->bmiHeader.biBitCount*iW) + 31)/32)*4;
lSize = lSize*iH;
// Alloker minne til kopi til clipboard
hMem=GlobalAlloc(GHND,lSize+wSize);
if (hMem!=NULL)
{
hpMem = (char huge *)GlobalLock(hMem);
// Kopier bildestrukturdataene
_fmemcpy(hpMem, bmpInfo, wSize);
// Sett pekeren til σ peke pσ det stedet hvor bildedataene skal
// begynne.
hpMem=&hpMem[wSize];
// Foreta en byte for byte kopiering. Ja, det er dσrlig, men
// dessverre klarte ikke _fmemcpy dette (selv om jeg kopierte
// linje for linje) sσ dette ble den letteste utveien jeg hadde
// tid til. Allikevel, sσ sent er det da ikke.
for (Count=0;Count<lSize;Count++)
*hpMem++=*hpBitmap++;
GlobalUnlock(hMem);
UnlockBMP();
// Lag en ekstra grσtonepalette som clipboard kan fσ.
hCbdPalette = ((TMainWindow *)Parent)->CreateGrayscalePalette();
// Send clipboard kopiene av dataene som vi har laget.
OpenClipboard(HWindow);
EmptyClipboard();
if (SetClipboardData(CF_DIB, hMem)==NULL)
MessageBox(HWindow, "Copy: Error transfering data", ERROR_CAPTION, MB_ERROR);
if (hCbdPalette!=NULL)
SetClipboardData(CF_PALETTE, hCbdPalette);
CloseClipboard();
}
else
MessageBox(HWindow, "Copy: Unable to create clipboard copy of bitmap",
ERROR_CAPTION, MB_ERROR);
}
else
MessageBox(HWindow, "Copy: Unable to lock bitmap",
ERROR_CAPTION, MB_ERROR);
ReleaseDC(HWindow, hdc);
SetCursor(hcrOld);
}
BOOL TGenericPicWindow::LockBMP()
/****************************************************************************
Locker bitmapbildet og lagrer en huge pointer til det.
Returnerer: TRUE hvis det lot seg lock
FALSE ellers
Kodet av: MK
*****************************************************************************/
{
hpBitmap = (char huge *)GlobalLock(hBitmap);
if (hpBitmap!=NULL)
return TRUE;
else
return FALSE;
}
void TGenericPicWindow::UnlockBMP()
/****************************************************************************
Unlocker bitmapbildet (hpBitmap ikke lenger brukbar).
Kodet av: MK 19.04.92
*****************************************************************************/
{
GlobalUnlock(hBitmap);
}
BITMAPINFO* TGenericPicWindow::MakeDuplicateBMPInfo(LPBITMAPINFO source)
/****************************************************************************
Denne allokerer en kopi av bildestrukturdataene og returnerer en peker
til denne.
LPBITMAPINFO source Peker til orginalen (dvs. den det skal kopieres
fra).
Kommentar: Denne ligger som en medlemsfunksjon, selv om den egentlig
ikke hadde trengt σ vµre det. Allikevel virket det naturlig.
Advarsel: Denne har ingen feilsjekking pσ om vi er tom for minne!
Kodet av: MK
*****************************************************************************/
{
WORD wSize;
BITMAPINFO *target;
wSize = sizeof(BITMAPINFOHEADER) + ((1 << source->bmiHeader.biBitCount) * sizeof(RGBQUAD));
target = (BITMAPINFO *)new char[wSize];
_fmemcpy(target, source, wSize);
return target;
}
void TGenericPicWindow::CopyBMP(HANDLE hSourceBitmap, HANDLE hTargetBitmap)
/****************************************************************************
Kopierer informasjon fra en bitmap til en annen.
HANDLE hSourceBitmap Bitmap som det skal kopieres fra.
HANDLE hTargetBitmap Bitmap som det skal kopieres til.
Kodet av: MK
*****************************************************************************/
{
char huge *source, huge *destination;
int n, iY, iMaxY;
source = (char far *)GlobalLock(hSourceBitmap);
destination = (char far *)GlobalLock(hTargetBitmap);
if ((source!=NULL) && (destination!=NULL))
{
iMaxY = bmpInfo->bmiHeader.biHeight-1;
n = bmpInfo->bmiHeader.biWidth;
// Kopierer bitmappene radvis
for (iY=iMaxY;iY>=0;iY--)
_fmemcpy(&destination[(long)iY*n], &source[(long)iY*n], n);
}
else
MessageBox(HWindow, "TGenericPicWindow::CopyBMP lock failed",
ERROR_CAPTION, MB_ERROR);
GlobalUnlock(hSourceBitmap);
GlobalUnlock(hTargetBitmap);
}